package br.com.petsis.entity;

// Generated 18/05/2011 10:52:24 by Hibernate Tools 3.3.0.GA

import static javax.persistence.GenerationType.IDENTITY;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.PostLoad;
import javax.persistence.PostPersist;
import javax.persistence.PostRemove;
import javax.persistence.PostUpdate;
import javax.persistence.PrePersist;
import javax.persistence.PreRemove;
import javax.persistence.PreUpdate;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.hibernate.validator.Length;
import org.hibernate.validator.NotNull;
import org.jboss.seam.Component;

import br.com.petsis.conversores.ConversorMonetario;
import br.com.petsis.enumerations.TipoOperacaoEnum;
import br.com.petsis.funcionalidades.auditoria.AuditoriaController;

/**
 * Pedido generated by hbm2java
 */
@Entity
@Table(name = "pedido")
public class Pedido implements java.io.Serializable {
	
	public static final char TIPO_PEDIDO_PETSHOP = 'P';
	public static final char TIPO_PEDIDO_CLINICA = 'C';

	private Integer idPedido;
	private Date dtaPedido;
	private Float vlrPedido;
	private String dscObservacoes;
	private Integer nroPedido;
	private Integer nroPedidoPacote;
	private Cliente cliente;
	private Character tpoPedido;
	private Pacote pacote;
	private Character flgPago;
	private FormaPagamento formaPagamento;
	private Set<PedidoPet> pedidoPets = new HashSet<PedidoPet>(0);
	private Set<PedidoServico> pedidoServicos = new HashSet<PedidoServico>(0);
	private Set<PedidoProduto> pedidoProdutos = new HashSet<PedidoProduto>(0);
	
	@Transient
	private float desconto;
	
	@Transient
	private float vlrDesconto;
	
	@Transient
	private boolean selecionado;
	
	@Transient
	private TipoOperacaoEnum tipoOperacao;
	
	@Transient
	private String dadosAntigos;
	
	@PostLoad
	public void registrarDadosAntigos(){
		AuditoriaController auditoriaController = (AuditoriaController)Component.getInstance("auditoriaController");
		dadosAntigos = auditoriaController.recuperaDadosConcatenados(this);
	}
	
	@PostPersist
	@PostUpdate
	@PostRemove
	public void registrarAuditoria(){
		AuditoriaController auditoriaController = (AuditoriaController)Component.getInstance("auditoriaController");
		auditoriaController.registraLogAuditoria(this, tipoOperacao, dadosAntigos);
	}
	
	@PrePersist
	public void registrarTipoOperacaoInclusao(){
		tipoOperacao = TipoOperacaoEnum.INCLUSAO;
	}

	@PreRemove
	public void registrarTipoOperacaoExcluir(){
		tipoOperacao = TipoOperacaoEnum.EXCLUSAO;
	}
	
	@PreUpdate
	public void registrarTipoOperacaoAlteracao(){
		tipoOperacao = TipoOperacaoEnum.ALTERACAO;
	}

	public Pedido() {
	}

	public Pedido(Date dtaPedido, float vlrPedido, String dscObservacoes) {
		this.dtaPedido = dtaPedido;
		this.vlrPedido = vlrPedido;
		this.dscObservacoes = dscObservacoes;
	}

	public Pedido(Date dtaPedido, float vlrPedido, String dscObservacoes,
			Set<PedidoPet> pedidoPets, Set<PedidoServico> pedidoServicos,
			Set<PedidoProduto> pedidoProdutos) {
		this.dtaPedido = dtaPedido;
		this.vlrPedido = vlrPedido;
		this.dscObservacoes = dscObservacoes;
		this.pedidoPets = pedidoPets;
		this.pedidoServicos = pedidoServicos;
		this.pedidoProdutos = pedidoProdutos;
	}

	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "ID_PEDIDO", unique = true, nullable = false)
	public Integer getIdPedido() {
		return this.idPedido;
	}

	public void setIdPedido(Integer idPedido) {
		this.idPedido = idPedido;
	}

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "DTA_PEDIDO", nullable = false, length = 19)
	@NotNull
	public Date getDtaPedido() {
		return this.dtaPedido;
	}

	public void setDtaPedido(Date dtaPedido) {
		this.dtaPedido = dtaPedido;
	}

	@Column(name = "VLR_PEDIDO", nullable = false, precision = 12, scale = 0)
	public Float getVlrPedido() {
		return this.vlrPedido;
	}

	public void setVlrPedido(Float vlrPedido) {
		this.vlrPedido = vlrPedido;
	}

	@Column(name = "DSC_OBSERVACOES", nullable = false, length = 500)
	@NotNull
	@Length(max = 500)
	public String getDscObservacoes() {
		return this.dscObservacoes;
	}

	@Column(name = "NRO_PEDIDO", nullable = false)
	@NotNull
	public Integer getNroPedido() {
		return nroPedido;
	}

	public void setNroPedido(Integer nroPedido) {
		this.nroPedido = nroPedido;
	}

	@Column(name = "NRO_PEDIDO_PACOTE", nullable = true)
	public Integer getNroPedidoPacote() {
		return nroPedidoPacote;
	}

	public void setNroPedidoPacote(Integer nroPedidoPacote) {
		this.nroPedidoPacote = nroPedidoPacote;
	}

	public void setDscObservacoes(String dscObservacoes) {
		this.dscObservacoes = dscObservacoes;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "pedido")
	public Set<PedidoPet> getPedidoPets() {
		return this.pedidoPets;
	}

	public void setPedidoPets(Set<PedidoPet> pedidoPets) {
		this.pedidoPets = pedidoPets;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "pedido")
	public Set<PedidoServico> getPedidoServicos() {
		return this.pedidoServicos;
	}

	public void setPedidoServicos(Set<PedidoServico> pedidoServicos) {
		this.pedidoServicos = pedidoServicos;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "pedido")
	public Set<PedidoProduto> getPedidoProdutos() {
		return this.pedidoProdutos;
	}

	public void setPedidoProdutos(Set<PedidoProduto> pedidoProdutos) {
		this.pedidoProdutos = pedidoProdutos;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "ID_CLIENTE", nullable = false)
	@NotNull
	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "ID_PACOTE", nullable = true)
	public Pacote getPacote() {
		return pacote;
	}

	public void setPacote(Pacote pacote) {
		this.pacote = pacote;
	}
	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "ID_FORMA_PAGAMENTO", nullable = false)
	public FormaPagamento getFormaPagamento() {
		return formaPagamento;
	}
	
	public void setFormaPagamento(FormaPagamento formaPagamento) {
		this.formaPagamento = formaPagamento;
	}

	@Transient
	public boolean isSelecionado() {
		return selecionado;
	}

	@Transient
	public void setSelecionado(boolean selecionado) {
		this.selecionado = selecionado;
	}

	@Column(name = "TPO_PEDIDO", nullable = false, length=1)
	@NotNull
	public Character getTpoPedido() {
		return tpoPedido;
	}

	public void setTpoPedido(Character tpoPedido) {
		this.tpoPedido = tpoPedido;
	}

	@Column(name = "FLG_PAGO", nullable = false, length=1)
	@NotNull
	public Character getFlgPago() {
		return flgPago;
	}

	public void setFlgPago(Character flgPago) {
		this.flgPago = flgPago;
	}

	@Transient
	public float getDesconto() {
		return desconto;
	}

	@Transient
	public void setDesconto(float desconto) {
		this.desconto = desconto;
	}

	@Transient
	public float getVlrDesconto() {
		return vlrDesconto;
	}

	@Transient
	public void setVlrDesconto(float vlrDesconto) {
		this.vlrDesconto = vlrDesconto;
	}

	@Transient
	public List<PedidoServico> getPedidoServicosList(){
		if(getPedidoServicos() != null){
			return new ArrayList<PedidoServico>(getPedidoServicos());
		}
		return new ArrayList<PedidoServico>();
	}
	
	@Transient
	public List<PedidoProduto> getPedidoProdutosList(){
		if(getPedidoProdutos() != null){
			return new ArrayList<PedidoProduto>(getPedidoProdutos());
		}
		return new ArrayList<PedidoProduto>();
	}
	
	@Transient
	public String getVlrPedidoFormatado(){
		if(getVlrPedido() != null){
			return ConversorMonetario.mascaraValor(getVlrPedido().toString());
		}
		return null;
	}
	
	@Transient
	public String getDtaPedidoFormatada(){
		if(getDtaPedido() != null){
			SimpleDateFormat sdf = new SimpleDateFormat("dd 'de' MMMM 'de' yyyy");
			return sdf.format(getDtaPedido());
		}
		return null;
	}
}
